﻿#region Using Declaration

using Opc.Da;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Timers;

#endregion Using Declaration

namespace T4_Eind_programma
{
    public class Controller
    {
        #region Variable Declaration

        protected static Opc.Da.Subscription group;
        protected Opc.Da.SubscriptionState groupStateRead = new Opc.Da.SubscriptionState();
        private const string bekersInDoeltankOPCNaam = "DB350_C1.bekers_C";
        private const string c1BezigOPCNaam = "C1_bezig";
        private const string doelTankC6Actief = "DB350_C1.doeltank_C6";
        private const string doelTankC7Actief = "DB350_C1.doeltank_C7";
        private const string doelTankC8Actief = "DB350_C1.doeltank_C8";
        private const string doelTankC9Actief = "DB350_C1.doeltank_C9";
        private const string groupName = "Group0";
        private const string mengbatchNummerOPCNaam = "DB.350.Mengbatchnummer";
        private const string mengverhouding = "DB350_C1.mengverhouding";
        private const string opcNaam = "T4 PROJECT>PLC8>";
        private const string opcURL = "opcda://Matrikon.OPC.SiemensPLC.1";
        private const string orderNummerOPCNaam = "DB.350.Ordernummer";
        private const string pauzeOPCNaam = "Pauzeren";
        private const string plaatsVat = "Plaats vat aan het begin van de band.";

        //TODO Aanpassen symbol names
        //TODO aanpassen lichtsluis
        //TODO aanpassen motor
        //TODO aangeven alle OEE namen
        private const string resterendeVatenC6NummerOPCNaam = "DB.360.Verwerken.Rechts";

        private const string resterendeVatenC7NummerOPCNaam = "DB.360.Verwerken.Links";
        private const string resterendeVatenC8NummerOPCNaam = "DB.360.Verwerken.Links";
        private const string resterendeVatenC9NummerOPCNaam = "DB.360.Verwerken.Links";
        private const string smaakOPCNaam = "DB350_C1.smaak";
        private const string statusBezig = "Bezig";
        private const string vatSensorOPCNaam = "LC4";
        private const string vulbatchCNummerOPCNaam = "DB.350.Vulbatchnummer_C";
        private static Opc.Da.Server m_server;
        private bool allowWrite = true;
        private List<Doeltank> doelTanken = new List<Doeltank>();

        private BindingList<ItemInfo> itemInfoList = new BindingList<ItemInfo>();

        private Hoofdscherm mijnHoofdscherm;
        private FileIO mijnIO = new FileIO();
        private List<OEEItem> oeeItemList = new List<OEEItem>();
        private BindingList<Order> orderList = new BindingList<Order>();

        private System.Timers.Timer timerUitvoer = new System.Timers.Timer(10000);
        private Stopwatch totalTime = new Stopwatch();

        private Stopwatch totalTimeActive = new Stopwatch();

        private Stopwatch totalTimeInactive = new Stopwatch();

        #endregion Variable Declaration

        #region Properties

        public List<Doeltank> DoelTanken
        {
            get { return doelTanken; }
            set { doelTanken = value; }
        }

        public BindingList<ItemInfo> ItemInfoList
        {
            get { return itemInfoList; }
            set { itemInfoList = value; }
        }

        public FileIO MijnIO
        {
            get { return mijnIO; }
            set { mijnIO = value; }
        }

        public List<OEEItem> OeeItemList
        {
            get { return oeeItemList; }
            set { oeeItemList = value; }
        }

        public BindingList<Order> OrderList
        {
            get { return orderList; }
            set { orderList = value; }
        }

        public System.Timers.Timer TimerUitvoer
        {
            get { return timerUitvoer; }
            set { timerUitvoer = value; }
        }

        public Stopwatch TotalTime
        {
            get { return totalTime; }
            set { totalTime = value; }
        }

        public Stopwatch TotalTimeActive
        {
            get { return totalTimeActive; }
            set { totalTimeActive = value; }
        }

        public Stopwatch TotalTimeInactive
        {
            get { return totalTimeInactive; }
            set { totalTimeInactive = value; }
        }

        #endregion Properties

        #region Constructor

        public Controller(Hoofdscherm mijnHoofdscherm)
        {
            this.mijnHoofdscherm = mijnHoofdscherm;
            InitaliseerConstructor();
        }

        private void InitaliseerConstructor()
        {
            orderList = mijnIO.ReadOrderList(mijnIO.Location, mijnIO.FileNameOrder);
            MaakVerbinding();
            if (CheckVerbinding() == true)
            {
                AanmakenTags();
            }
            totalTime.Start();

            totalTimeInactive.Start();

            timerUitvoer.Elapsed += timerUitvoer_Elapsed;
            doelTanken = mijnIO.ReadDoeltanken();
            if (doelTanken.Count < 7)
            {
                doelTanken.Clear();
                doelTanken.Add(new Doeltank(1));
                doelTanken.Add(new Doeltank(5));
                doelTanken.Add(new Doeltank(6));
                doelTanken.Add(new Doeltank(7));
                doelTanken.Add(new Doeltank(8));
                doelTanken.Add(new Doeltank(9));
                doelTanken.Add(new Doeltank(99));
            }

            oeeItemList = mijnIO.ReadOEE();
            oeeItemList.Add(new OEEItem(DateTime.Now, itemInfoList,
                Convert.ToDateTime(totalTime.Elapsed.ToString()),
                Convert.ToDateTime(totalTimeActive.Elapsed.ToString()),
                Convert.ToDateTime(totalTimeInactive.Elapsed.ToString())
                ));
            oeeItemList[oeeItemList.Count - 1].RedenLijst.Add(new RedenInactiviteit("Nog niet op uitvoeren gedrukt", DateTime.Now));
            oeeItemList[oeeItemList.Count - 1].RedenLijst[oeeItemList[oeeItemList.Count - 1].RedenLijst.Count - 1].TijdInactief.Start();
        }

        #endregion Constructor

        #region VerbindingOPC

        public void AanmakenTags()
        {
            var tagsFromFile = mijnIO.ParseCSV(mijnIO.Location, mijnIO.FileNameCSV);

            var aantal = tagsFromFile.Count();
            if (group.Items.Length > 0)
                return;

            try
            {
                Opc.Da.Item[] item1 = new Opc.Da.Item[aantal];
                for (int i = 0; i < item1.Length; i++)
                {
                    item1[i] = new Opc.Da.Item() { ItemName = tagsFromFile[i] };
                }

                group.AddItems(item1);
                mijnHoofdscherm.AddToLog("Tags zijn aangemaakt", Color.Green);
            }
            catch
            {
                DisconnectOPC();
                mijnHoofdscherm.AddToLog("Fout bij aanmaken Tags", Color.Red);
            }
        }

        public bool CheckVerbinding()
        {
            // check of er verbinding is met de OPC server
            if (m_server.IsConnected == true)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        public void DisconnectOPC()
        {
            try
            {
                if (m_server != null && m_server.IsConnected == true)
                {
                    m_server.Disconnect();
                    if (CheckVerbinding() == false)
                    {
                        mijnHoofdscherm.AddToLog("Verbinding met OPC is succesvol verbroken", Color.Black);
                    }
                }
            }
            catch (Exception)
            {
                mijnHoofdscherm.AddToLog("Verbinding met OPC kon niet verbroken worden.", Color.Red);
            }
        }

        public void MaakVerbinding()
        {
            try
            {
                m_server = null;

                m_server = new Opc.Da.Server(new OpcCom.Factory(), null);

                m_server.Connect(new Opc.URL(opcURL), new Opc.ConnectData(
                    new System.Net.NetworkCredential()
                    {
                        UserName = "",
                        Password = ""
                    }));
                m_server.ServerShutdown += m_server_ServerShutdown;
                if (CheckVerbinding() == true)
                {
                    mijnHoofdscherm.AddToLog("Verbinding met OPC is succesvol", Color.Green);
                    MaakGroup(groupName, 1000, true);
                }
            }
            catch
            {
                mijnHoofdscherm.AddToLog("Verbinding met OPC is mislukt.", Color.Red);
                DisconnectOPC();
            }
        }

        private void MaakGroup(string name, int updaterate, bool active)
        {
            if (m_server.IsConnected == true && m_server.Subscriptions.Count == 0)
            {
                group = (Opc.Da.Subscription)m_server.CreateSubscription(new Opc.Da.SubscriptionState() { Name = name, Active = active, UpdateRate = updaterate });
                group.DataChanged += new Opc.Da.DataChangedEventHandler(group_DataChanged);
                if (group != null
                     && group.Active == true)
                {
                    mijnHoofdscherm.AddToLog(group.Name + " is succesvol aangemaakt", Color.Black);
                }
            }

            else
            {
                mijnHoofdscherm.AddToLog("Aanmaken van Group is mislukt", Color.Red);
            }
        }

        #endregion VerbindingOPC

        #region Timer Uitvoer

        private void timerUitvoer_Elapsed(object sender, ElapsedEventArgs e)
        {
            Uitvoeren();
        }

        #endregion Timer Uitvoer

        #region OPC

        public void GeefInfoListDoorAanOPC(List<ItemInfo> newInfo)
        {
            
            try
            {
                group.RemoveItems(group.Items);
                var valueList = new List<ItemValue>();
                var itemArray = new Item[newInfo.Count];

                for (int i = 0; i < itemArray.Length; i++)
                {
                    itemArray[i] = new Item();
                    itemArray[i].ItemName = newInfo[i].Name;
                    var itemValue = new ItemValue(itemArray[i]);
                    itemValue.Value = newInfo[i].ItemValue;
                    valueList.Add(itemValue);
                }
                //#1: assign the item to the group so the items gets a ServerHandle
                group.AddItems(itemArray);
                // #2: assign the server handle to the ItemValue
                for (int i = 0; i < valueList.Count; i++)
                    valueList[i].ServerHandle = group.Items[i].ServerHandle;
                // #3: write
                group.Write(valueList.ToArray());
                allowWrite = true;
            }
            catch
            {
                mijnHoofdscherm.AddToLog("Kan het niet weg schrijven", Color.Red);
            }
        }

        public void WriteMengbatchToOPC(Mengbatch mengbatch)
        {
            allowWrite = false;
            group.RemoveItems(group.Items);
            var tagsFromFile = mijnIO.ParseCSV(mijnIO.Location, mijnIO.FileNameCSV);
            var aantal = tagsFromFile.Count();
            try
            {
                var valueList = new List<ItemValue>();
                var itemArray = new Item[aantal];
                for (int i = 0; i < aantal; i++)
                {
                    itemArray[i] = new Item();
                    itemArray[i].ItemName = tagsFromFile[i];
                    var waardeItem = new ItemValue(itemArray[i]);
                    switch (itemArray[i].ItemName)
                    {
                        case opcNaam + mengverhouding:
                            waardeItem.Value = mengbatch.SiroopPercentage;
                            break;

                        case opcNaam + smaakOPCNaam:
                            waardeItem.Value = mengbatch.Smaak.Nummer;

                            break;

                        case opcNaam + doelTankC6Actief:
                            var query = (from vulbatch in mengbatch.VulbatchList
                                         where vulbatch.Doeltank.Nummer == 6
                                         select vulbatch).FirstOrDefault();
                            if (query != null)
                            {
                                waardeItem.Value = true;
                            }
                            else
                            {
                                waardeItem.Value = false;
                            }
                            break;

                        case opcNaam + doelTankC7Actief:
                            var query2 = (from vulbatch in mengbatch.VulbatchList
                                          where vulbatch.Doeltank.Nummer == 7
                                          select vulbatch).FirstOrDefault();
                            if (query2 != null)
                            {
                                waardeItem.Value = true;
                            }
                            else
                            {
                                waardeItem.Value = false;
                            }
                            break;

                        case opcNaam + doelTankC8Actief:
                            var query3 = (from vulbatch in mengbatch.VulbatchList
                                          where vulbatch.Doeltank.Nummer == 8
                                          select vulbatch).FirstOrDefault();
                            if (query3 != null)
                            {
                                waardeItem.Value = true;
                            }
                            else
                            {
                                waardeItem.Value = false;
                            }
                            break;

                        case opcNaam + doelTankC9Actief:
                            var query4 = (from vulbatch in mengbatch.VulbatchList
                                          where vulbatch.Doeltank.Nummer == 9
                                          select vulbatch).FirstOrDefault();
                            if (query4 != null)
                            {
                                waardeItem.Value = true;
                            }
                            else
                            {
                                waardeItem.Value = false;
                            }
                            break;

                        case opcNaam + "DB350_C1.bekers_C6":
                            var query5 = (from vulbatch in mengbatch.VulbatchList
                                          where vulbatch.Doeltank.Nummer == 6
                                          select vulbatch).FirstOrDefault();
                            if (query5 != null)
                            {
                                waardeItem.Value = query5.AantalVaten;
                            }
                            else
                            {
                                waardeItem.Value = 0;
                            }
                            break;

                        case opcNaam + "DB350_C1.bekers_C7":
                            var query6 = (from vulbatch in mengbatch.VulbatchList
                                          where vulbatch.Doeltank.Nummer == 7
                                          select vulbatch).FirstOrDefault();
                            if (query6 != null)
                            {
                                waardeItem.Value = query6.AantalVaten;
                            }
                            else
                            {
                                waardeItem.Value = 0;
                            }
                            break;

                        case opcNaam + "DB350_C1.bekers_C8":
                            var query7 = (from vulbatch in mengbatch.VulbatchList
                                          where vulbatch.Doeltank.Nummer == 8
                                          select vulbatch).FirstOrDefault();
                            if (query7 != null)
                            {
                                waardeItem.Value = query7.AantalVaten;
                            }
                            else
                            {
                                waardeItem.Value = 0;
                            }
                            break;

                        case opcNaam + "DB350_C1.bekers_C9":
                            var query8 = (from vulbatch in mengbatch.VulbatchList
                                          where vulbatch.Doeltank.Nummer == 9
                                          select vulbatch).FirstOrDefault();
                            if (query8 != null)
                            {
                                waardeItem.Value = query8.AantalVaten;
                            }
                            else
                            {
                                waardeItem.Value = 0;
                            }
                            break;

                        case opcNaam + "DB350_C1.Vulbatchnummer_C6":
                            var query9 = (from vulbatch in mengbatch.VulbatchList
                                          where vulbatch.Doeltank.Nummer == 6
                                          select vulbatch).FirstOrDefault();
                            if (query9 != null)
                            {
                                waardeItem.Value = query9.Nummer;
                            }
                            else
                            {
                                waardeItem.Value = 5;
                            }
                            break;

                        case opcNaam + "DB350_C1.Vulbatchnummer_C7":
                            var query10 = (from vulbatch in mengbatch.VulbatchList
                                           where vulbatch.Doeltank.Nummer == 7
                                           select vulbatch).FirstOrDefault();
                            if (query10 != null)
                            {
                                waardeItem.Value = query10.Nummer;
                            }
                            else
                            {
                                waardeItem.Value = 5;
                            }
                            break;

                        case opcNaam + "DB350_C1.Vulbatchnummer_C8":
                            var query11 = (from vulbatch in mengbatch.VulbatchList
                                           where vulbatch.Doeltank.Nummer == 8
                                           select vulbatch).FirstOrDefault();
                            if (query11 != null)
                            {
                                waardeItem.Value = query11.Nummer;
                            }
                            else
                            {
                                waardeItem.Value = 5;
                            }
                            break;

                        case opcNaam + "DB350_C1.Vulbatchnummer_C9":
                            var query12 = (from vulbatch in mengbatch.VulbatchList
                                           where vulbatch.Doeltank.Nummer == 9
                                           select vulbatch).FirstOrDefault();
                            if (query12 != null)
                            {
                                waardeItem.Value = query12.Nummer;
                            }
                            else
                            {
                                waardeItem.Value = 5;
                            }
                            break;

                        case opcNaam + "DB350_C1.mengbekers":
                            waardeItem.Value = mengbatch.Hoeveelheid;
                            break;

                        default:
                            break;
                    }
                    valueList.Add(waardeItem);
                }
                
                group.AddItems(itemArray);
                var test = 0;

                for (int z = 0; z < tagsFromFile.Count; z++)
                {
                    try
                    {
                        valueList[z].ServerHandle = group.Items[z].ServerHandle;
                        test = z;
                    }
                    catch (Exception)
                    {
                        mijnHoofdscherm.AddToLog("Fout met OPC Handle", Color.Red);
                    }
                    
                }
                group.Write(valueList.ToArray());
                mengbatch.Status = statusBezig;
                var info = (from item in itemInfoList
                            where item.FilteredName == "Start_Productie"
                            select item).FirstOrDefault();
                
                var list = new List<ItemInfo>();
                if (info != null)
                {
                    info.ItemValue = true;
                    list.Add(info);
                }
                GeefInfoListDoorAanOPC(list);
                allowWrite = true;
            }

            catch
            {
                mijnHoofdscherm.AddToLog("Kan het niet weg schrijven", Color.Red);
            }
            finally
            {
                allowWrite = true;
            }
        }

        private void group_DataChanged(object subscriptionHandle, object requestHandle, ItemValueResult[] values)
        {
            if (itemInfoList.Count == 0)
            {
                foreach (ItemValueResult itemValue in values)
                {
                    itemInfoList.Add(new ItemInfo(itemValue.ItemName, itemValue.Value));
                }
            }
            else
            {
                for (int i = 0; i < values.Length; i++)
                {
                    var infoListInfo = itemInfoList.Where(temp1 => temp1.Name == values[i].ItemName).FirstOrDefault();
                    if (infoListInfo != null && values[i].Value != infoListInfo.ItemValue)
                    {
                        if (values[i].Value is int || values[i].Value is bool)
                            infoListInfo.ItemValue = values[i].Value;
                    }
                }
            }
            VoegActieveOutputToeAanApparatenLijst();
            VeranderResterendeVaten();
            UpdateDoeltankenInGebruik();
            SetVorigeAantalVaten();
        }

        private void m_server_ServerShutdown(string reason)
        {
            mijnHoofdscherm.AddToLog("Verbinding met OPC is verbroken door:" + reason, Color.Red);
        }

        #endregion OPC

        #region Uitvoer

        public void KiesOptimaleDoeltank(Mengbatch mengbatch)
        {
            foreach (var item in mengbatch.VulbatchList)
            {
                var newTank = item.Doeltank;

                var query = (from doeltank in doelTanken
                             where ((mengbatch.Smaak == doeltank.HuidigeSmaak) || doeltank.HuidigeSmaak.Naam == "Leeg") &&
                             doeltank.InGebruik == false
                             select doeltank).FirstOrDefault();

                if (query != null)
                {
                    newTank = query;
                    if (mengbatch.VulbatchList.Count > 1)
                    {
                        if (newTank.Nummer == 6 || newTank.Nummer == 8)
                            mengbatch.VulbatchList[1].Doeltank = new Doeltank(newTank.Nummer + 1);
                        else if (newTank.Nummer == 7 || newTank.Nummer == 9)
                            mengbatch.VulbatchList[1].Doeltank = new Doeltank(newTank.Nummer - 1);

                        return;
                    }
                    else if (mengbatch.VulbatchList.Count == 1)
                    {
                        mengbatch.VulbatchList[0].Doeltank = newTank;
                    }
                    else
                        SpoelDoelTanken();
                }
                else
                    SpoelDoelTanken();
            }
        }

        public void SpoelDoelTanken()
        {
            var spoelTanken = new List<Doeltank>();
            var nietLegeTanken = (from doeltank in doelTanken
                                  where doeltank.HuidigeSmaak.Naam != "Leeg"
                                  && doeltank.InGebruik == false
                                  select doeltank);
            var tankC6 = (from tank in nietLegeTanken
                          where tank.Nummer == 6
                          select tank).FirstOrDefault();
            var tankC7 = (from tank in nietLegeTanken
                          where tank.Nummer == 7
                          select tank).FirstOrDefault();
            var tankC8 = (from tank in nietLegeTanken
                          where tank.Nummer == 8
                          select tank).FirstOrDefault();
            var tankC9 = (from tank in nietLegeTanken
                          where tank.Nummer == 9
                          select tank).FirstOrDefault();

            if (tankC6 != null)
            {
                spoelTanken.Add(tankC6);
            }
            else if (tankC7 != null)
            {
                spoelTanken.Add(tankC7);
            }
            else if (tankC8 != null)
            {
                if (spoelTanken.Count == 0)
                    spoelTanken.Add(tankC8);
            }
            else if (tankC9 != null)
            {
                if (spoelTanken.Count == 0 || spoelTanken.Count == 1)
                    spoelTanken.Add(tankC9);
            }
            WriteMengbatchToOPC(MaakSpoelBatch(spoelTanken));
        }

        public void UitvoerenNaarOPC(Mengbatch mengbatch)
        {
            CheckDoelTankInGebruikHandmatig(mengbatch);
            WriteMengbatchToOPC(mengbatch);
            foreach (var vulbatch in mengbatch.VulbatchList)
            {
                var tank = (from doeltank in doelTanken
                            where doeltank.Nummer == vulbatch.Doeltank.Nummer
                            select doeltank).FirstOrDefault();
                if (tank != null)
                    tank.HuidigeSmaak = mengbatch.Smaak;

                var c1 = (from tanken in doelTanken
                          where tanken.Nummer == 1
                          select tanken).FirstOrDefault();
                if (c1 != null)
                    c1.HuidigeSmaak = mengbatch.Smaak;
            }
        }

        private void CheckDoelTankInGebruikHandmatig(Mengbatch mengbatch)
        {
            var query = (from doeltank in doelTanken
                         where doeltank.Nummer == mengbatch.Doeltank[0].Nummer
                         && doeltank.InGebruik == true
                         select doeltank);
            var queryOrders = (from orders in orderList
                               where orders.Klaar == false
                               select orders);
            var c1 = (from tank in doelTanken
                      where tank.Nummer == 1
                      select tank).FirstOrDefault();

            if (c1 != null && c1.HuidigeSmaak != mengbatch.Smaak)
            {
                var tempAantal = 0;
                foreach (var item in mengbatch.VulbatchList)
                {
                    tempAantal += item.AantalVaten;
                }
                var newBatch = new Mengbatch(0, false) { SiroopPercentage = 0, Smaak = new Smaak("Spoelen"), Hoeveelheid = tempAantal };
                var list = new List<Doeltank>();
                list.Add(new Doeltank(99));
                if (tempAantal > 5)
                    list.Add(new Doeltank(99));
                c1.HuidigeSmaak = new Smaak("Spoelen");
                newBatch.GenereerVulbatchList(list);
                WriteMengbatchToOPC(newBatch);
            }

            if (mengbatch.Handmatig == true && query != null && query.Count() == mengbatch.VulbatchList.Count)
            {
                mijnHoofdscherm.AddToLog("De gekozen doeltank(en) bij mengbatch:" + mengbatch.Nummer + " is/zijn al in gebruik, de mengbatch is in de wacht gezet.", Color.Red);
                foreach (var item in queryOrders)
                {
                    foreach (var batch in item.MengbatchList)
                    {
                        if (mengbatch == batch)
                        {
                            var temp = mengbatch;
                            item.MengbatchList.Remove(mengbatch);
                            item.MengbatchList.Add(temp);
                        }
                    }
                }
            }
            else
                KiesOptimaleDoeltank(mengbatch);
        }

        private Mengbatch MaakSpoelBatch(List<Doeltank> tank)
        {
            var tempAantal = 0;
            foreach (var item in tank)
            {
                tempAantal += item.VorigeAantalVaten;
            }
            var newBatch = new Mengbatch(0, false) { SiroopPercentage = 0, Smaak = new Smaak("Spoelen"), Hoeveelheid = tempAantal };
            newBatch.GenereerVulbatchList(tank);
            return newBatch;
        }

        private void Uitvoeren()
        {
            var pauzeOPC = (from iteminfo in itemInfoList
                            where iteminfo.FilteredName == pauzeOPCNaam
                            select iteminfo).FirstOrDefault();
            var doorgevenBezigOPC = (from item in itemInfoList
                                     where item.FilteredName == c1BezigOPCNaam
                                     select item).FirstOrDefault();
            var lichtsluisBegin = (from item in itemInfoList
                                   where item.FilteredName == vatSensorOPCNaam
                                   select item).FirstOrDefault();
            var motorLoopband = (from item in itemInfoList
                                 where item.FilteredName == "Blaat"
                                 select item).FirstOrDefault();
            var batchAanwezig = (from item in itemInfoList
                                 where item.FilteredName == "batch_aanwezig"
                                 select item).FirstOrDefault();
            if (doorgevenBezigOPC != null && Convert.ToBoolean(doorgevenBezigOPC.ItemValue) == true)
                return;

            if (batchAanwezig != null && Convert.ToBoolean(batchAanwezig.ItemValue) == true)
                return;

            if (allowWrite == false)
                return;

            if (pauzeOPC != null && Convert.ToBoolean(pauzeOPC.ItemValue) == true)
                return;

            var reden = new RedenInactiviteit("Geen beker neergezet", DateTime.Now);
            if (lichtsluisBegin != null && Convert.ToBoolean(lichtsluisBegin.ItemValue) == false && Convert.ToBoolean(motorLoopband.ItemValue) == false)
            {
                if (oeeItemList[oeeItemList.Count - 1].RedenLijst[oeeItemList[oeeItemList.Count - 1].RedenLijst.Count - 1].Reden == reden.Reden)
                {
                }
                else
                    oeeItemList[oeeItemList.Count - 1].RedenLijst.Add(reden);
            }
            if (lichtsluisBegin != null && Convert.ToBoolean(lichtsluisBegin.ItemValue) == true)
            {
                foreach (var item in oeeItemList[oeeItemList.Count - 1].RedenLijst)
                {
                    if (item.Reden == "Geen beker neergezet")
                        item.StopTimerActief();
                }
            }

            var orderItem = (from order in orderList
                             where order.Klaar == false
                             where order.MengbatchList.Count > 0
                             select order).FirstOrDefault();
            // als er een order is die nog niet klaar is en waar meer dan 0 mengbatches inzitten
            if (orderItem != null && orderItem.MengbatchList.Count > 0)
            {
                var mengbatchItem = (from mengbatch in orderItem.MengbatchList
                                     where mengbatch.Klaar == false &&
                                     mengbatch.Status != statusBezig
                                     select mengbatch).FirstOrDefault();
                // als er een mengbatch is die nog niet klaar is
                if (mengbatchItem != null)
                {
                    if (doorgevenBezigOPC != null &&
                        Convert.ToBoolean(doorgevenBezigOPC.ItemValue) == false &&
                        allowWrite == true &&
                        batchAanwezig != null &&
                        Convert.ToBoolean(batchAanwezig.ItemValue) == false)
                    {
                        // het wordt doorgegeven, c1_bezig wordt geset, programma komt hier pas weer wanneer die niet meer waar is
                        UitvoerenNaarOPC(mengbatchItem);
                        mijnHoofdscherm.AddToLog(plaatsVat, Color.Black);
                        mijnHoofdscherm.AddToLog("Mengbatch " + mengbatchItem.Nummer + " uit order " + orderItem.Nummer + " wordt nu uitgevoerd.", Color.Black);
                    }
                }
            }
        }

        #endregion Uitvoer

        #region UpdateViaOPC

        public int BerekenSchattingResterendeTijd()
        {
            int tijd = 0; // ms
            int tijdPerBekerVullen = 26000;
            int aanvoerTijd = 7500;

            var nietKlaarOrders = (from order in orderList
                                   where order.Klaar == false
                                   where order.MengbatchList.Count > 0
                                   select order);
            foreach (var item in nietKlaarOrders)
            {
                foreach (var mengbatch in item.MengbatchList)
                {
                    if (mengbatch.Klaar == false)
                    {
                        foreach (var vulbatch in mengbatch.VulbatchList)
                        {
                            if (vulbatch.RestVaten > 0)
                                tijd += (tijdPerBekerVullen * vulbatch.RestVaten) + aanvoerTijd;
                        }
                    }
                }
            }
            return tijd;
        }

        private void SetVorigeAantalVaten()
        {
            foreach (var item in doelTanken)
            {
                if (item.Nummer >= 6 && item.Nummer <= 9)
                {
                    var infoActief = (from info in itemInfoList
                                      where info.FilteredName == "DB350_C1.doeltank_C" + item.Nummer
                                      select info).FirstOrDefault();

                    if (infoActief != null && Convert.ToBoolean(infoActief.ItemValue) == true)
                    {
                        var bekerAantalnfo = (from itemInfo in itemInfoList
                                              where itemInfo.FilteredName == bekersInDoeltankOPCNaam + item.Nummer
                                              select itemInfo).FirstOrDefault();

                        if (bekerAantalnfo != null)
                            item.VorigeAantalVaten = Convert.ToInt32(bekerAantalnfo.ItemValue);
                    }
                }
            }
        }

        private void UpdateDoeltankenInGebruik()
        {
            foreach (var item in doelTanken)
            {
                var doeltank = (from tank in itemInfoList
                                where item.Naam == (vulbatchCNummerOPCNaam + item.Nummer.ToString())
                                select tank).FirstOrDefault();

                if (doeltank != null && Convert.ToBoolean(doeltank.ItemValue) == true)
                    item.InGebruik = true;
            }
        }

        private void VeranderKlaar(Order orderItem, Mengbatch mengbatchItem, Vulbatch vulbatchItem)
        {
            if (vulbatchItem.GevuldeVaten == vulbatchItem.AantalVaten)
            {
                vulbatchItem.Klaar = true;
                mijnHoofdscherm.AddToLog("Het uitvoeren van vulbatch " + vulbatchItem.Nummer +
                    " uit mengbatch " + mengbatchItem.Nummer +
                    " in order " + orderItem.Nummer +
                    " is voltooid.", Color.Green);
            }

            var klareVulbatches = (from meng in mengbatchItem.VulbatchList
                                   where meng.Klaar == true
                                   select meng);

            if (klareVulbatches.Count() == mengbatchItem.VulbatchList.Count)
            {
                mengbatchItem.Klaar = true;
                mijnHoofdscherm.AddToLog("Het uitvoeren van mengbatch " + mengbatchItem.Nummer + " uit order " + orderItem.Nummer + " is voltooid.", Color.Green);
            }

            var klareMengbatches = (from order in orderItem.MengbatchList
                                    where order.Klaar == true
                                    select order);

            if (klareMengbatches.Count() == orderItem.MengbatchList.Count)
            {
                orderItem.Klaar = true;
                mijnHoofdscherm.AddToLog("Het uitvoeren van order " + orderItem.Nummer + " is voltooid.", Color.Green);
            }
            var klareOrders = (from order in orderList
                               where order.Klaar == true
                               select order);
            if (klareOrders.Count() == orderList.Count)
            {
                totalTimeActive.Stop();
                timerUitvoer.Stop();
                totalTimeInactive.Start();
                mijnHoofdscherm.AddToLog("Het uitvoeren van alle orders is voltooid.", Color.Green);
            }
        }

        private void VeranderResterendeVaten()
        {
            var infoOrderNummer = (from orderInfoItem in itemInfoList
                                   where orderInfoItem.FilteredName == orderNummerOPCNaam
                                   select orderInfoItem).FirstOrDefault();
            var infoMengbatchNummer = (from mengbatchInfoItem in itemInfoList
                                       where mengbatchInfoItem.FilteredName == mengbatchNummerOPCNaam
                                       select mengbatchInfoItem).FirstOrDefault();

            var infoVulbatchNummer = (from vulbatchInfoItem in itemInfoList
                                      where vulbatchInfoItem.FilteredName.Contains(vulbatchCNummerOPCNaam)
                                      select vulbatchInfoItem);

            var gesetteTanken = (from info in infoVulbatchNummer
                                 where Convert.ToBoolean(info.ItemValue) == true
                                 select info);
            foreach (var item in gesetteTanken)
            {
                var resterendeVatenC6 = (from restVaten in itemInfoList
                                         where restVaten.FilteredName == resterendeVatenC6NummerOPCNaam
                                         select restVaten).FirstOrDefault();
                var resterendeVatenC7 = (from restVaten in itemInfoList
                                         where restVaten.FilteredName == resterendeVatenC7NummerOPCNaam
                                         select restVaten).FirstOrDefault();
                var resterendeVatenC8 = (from restVaten in itemInfoList
                                         where restVaten.FilteredName == resterendeVatenC8NummerOPCNaam
                                         select restVaten).FirstOrDefault();
                var resterendeVatenC9 = (from restVaten in itemInfoList
                                         where restVaten.FilteredName == resterendeVatenC9NummerOPCNaam
                                         select restVaten).FirstOrDefault();

                if (infoOrderNummer != null && infoMengbatchNummer != null)
                {
                    var orderItem = (from order in orderList
                                     where order.Nummer == Convert.ToInt32(infoOrderNummer.ItemValue)
                                     select order).FirstOrDefault();
                    var mengbatchItem = (from mengbatch in orderItem.MengbatchList
                                         where mengbatch.Nummer == Convert.ToInt32(infoMengbatchNummer)
                                         select mengbatch).FirstOrDefault();
                    var vulbatchItem = (from vulbatch in mengbatchItem.VulbatchList
                                        where vulbatch.Nummer == Convert.ToInt32(item.ItemValue)
                                        select vulbatch).FirstOrDefault();

                    if (vulbatchItem != null && resterendeVatenC6 != null && (vulbatchItem.Doeltank.Nummer == 6))
                        vulbatchItem.RestVaten = Convert.ToInt32(resterendeVatenC6.ItemValue);

                    if (vulbatchItem != null && resterendeVatenC6 != null && (vulbatchItem.Doeltank.Nummer == 7))
                        vulbatchItem.RestVaten = Convert.ToInt32(resterendeVatenC7.ItemValue);

                    if (vulbatchItem != null && resterendeVatenC6 != null && (vulbatchItem.Doeltank.Nummer == 8))
                        vulbatchItem.RestVaten = Convert.ToInt32(resterendeVatenC8.ItemValue);

                    if (vulbatchItem != null && resterendeVatenC6 != null && (vulbatchItem.Doeltank.Nummer == 9))
                        vulbatchItem.RestVaten = Convert.ToInt32(resterendeVatenC9.ItemValue);

                    VeranderKlaar(orderItem, mengbatchItem, vulbatchItem);
                }
            }
        }

        private void VoegActieveOutputToeAanApparatenLijst()
        {
            var orderNietklaar = (from order in orderList
                                  where order.Klaar == false
                                  select order);

            foreach (var order in orderNietklaar)
            {
                var mengbatchActief = (from mengbatch in order.MengbatchList
                                       where mengbatch.Klaar == false
                                       where mengbatch.Status == statusBezig
                                       select mengbatch);

                foreach (var mengbatch in mengbatchActief)
                {
                    var vulbatchItem = (from vulbatchItems in mengbatch.VulbatchList
                                        where vulbatchItems.Klaar == false
                                        select vulbatchItems);

                    foreach (var vulbatch in vulbatchItem)
                    {
                        foreach (var item in itemInfoList)
                        {
                            if (item.Active == true)
                            {
                                if (vulbatch.GebruikteApparaten.Contains(item.FilteredName) == false)
                                    vulbatch.GebruikteApparaten.Add(item.FilteredName);
                            }
                        }
                    }
                }
            }
        }

        #endregion UpdateViaOPC
    }
}